// 集合结构的封装

export default class Set {
	constructor() {
		this.items = {};
	}
	
	// has(value) 判断集合中是否存在 value 值，存在返回 true, 否则返回 false 
	has(value) {
		// eslint-disable-next-line no-prototype-builtins
		return this.items.hasOwnProperty(value);
	}
	
	// add(value) 往集合中添加 value
	add(value) {
		if (this.has(value)) return false;
		this.items[value] = value;
		return true;
	}
	
	// remove(value) 删除集合中指定的 value
	remove(value) {
		// 如果集合不存在该 value，返回  false;
		if (!this.has(value)) return false;
		delete this.items[value];
	}
	
	// clear() 清空集合中所有 value
	clear() {
		this.items = {};
	}
	
	// size() 获取集合中的 value 个数
	size() {
		return Object.keys(this.items).length;
	}
	
	// values() 获取集合中所有的 value
	values() {
		return Object.keys(this.items);
	}

	
	// ------- 集合间操作 ----------//
	// union() 求两个集合的并集
	union(otherSet) {
		// 1.创建一个新集合
		let unionSet = new Set();
		
		// 2.将当前集合（this）的所有 value，添加到新集合（unionSet）中
		for (let value of this.values()) {
			unionSet.add(value);
		}
		
		// 3.将 otherSet 集合的所有 value，添加到新集合（unionSet）中
		for (let value of otherSet.values()) {
			unionSet.add(value);   // add() 已经有重复判断
		}
		
		return unionSet;
	}
	
	// intersection() 求两个集合的交集
	intersection(otherSet) {
		
		// 1.创建一个新集合
		let intersectionSet = new Set();
		
		// 2.从当前集合中取出每一个 value，判断是否在 otherSet 集合中存在
		for (let value of this.values()) {
			if(otherSet.has(value)) {
				intersectionSet.add(value);
			}
		}
		
		return intersectionSet;
	}
	
	// difference() 差集
	difference(otherSet) {
		// 1.创建一个新集合
		let differenceSet = new Set();
		
		// 2.从当前集合中取出一个 value，判断是否在 otherSet 集合中存在，不存在的即为差集
		for (let value of this.values()) {
			if(!otherSet.has(value)) {
				differenceSet.add(value);
			}
		}
		
		// 3.从otherSet集合中取出一个 value，判断是否在 当前集合 中存在，不存在的即为差集
		for (let value of otherSet.values()) {
			if(!this.has(value)) {
				differenceSet.add(value);
			}
		}
		
		return differenceSet;
	}
	
	// subset() 子集
	subset(otherSet) {
		
		// 从当前集合中取出每一个 value，判断是否在 otherSet 集合中存在，有不存在的返回 false
		// 遍历完所有的，返回 true
		for(let value of this.values()) {
			if (!otherSet.has(value)) {
				return false;
			}
		}
		return true;
	}
}